/**
 * 工作台共享工具类方法
 * 注意，本工具类内的方法应当使用function定义，以方便直接注入到Vue实例的methods中
 *
 * 其中，以下标明为【实例注入方法】的为直接注入到Vue实例的方法，而不是普通的工具方法，使用方法示例：
 * import { getDependenceManage } from "@/utils/iwhale-util";
 * export default {
 *   ...,
 *   methods: {
 *     getDependenceManage,
 *   },
 * }
 */

import dayjs from "dayjs";
import { getConfigByKey } from "@/api/system/config";

// 格式化时间
// time: 时间戳 format：dayjs支持的格式 fallback：如果值为空，则返回的填充字符串，不传默认为-
export function dateFormat(
  time,
  format = "YYYY-MM-DD HH:mm:ss",
  fallback = "-"
) {
  if (!time) {
    return fallback;
  }
  return dayjs(time).format(format);
}

// 校验范围字段。
// 范围字段的定义：实际数据为有分隔符的字符串，如【100x200】、【1~2】、【0~200】等
// 这个方法应当结合MultiField组件使用
// 可选的规则配置项：
// min: 最小值，默认0
// max: 最大值，默认1000
// separator: 分隔符，默认x。注意，必须准确配置它，不然split的时候一旦出现问题就无法正确判断范围
// integer: 是否只允许整数，这个只影响文字提示！，默认false
// asc: 是否需要升序（第一个值必须小于第二个值），默认true
// fullrange: 是否需要完整范围（如果只填写了最小值/最大值其中的一个，跑错误），默认true
export function validateRangeField(rule, value, callback) {
  const {
    min = 0,
    max = 1000,
    separator = "x",
    integer = false,
    asc = true,
    fullrange = false,
    fullrangemessage = "请输入完整范围",
  } = rule;
  if (!value) {
    // 如果没有值，那么直接通过校验（为空的情况，必填项校验会处理）
    callback();
    return;
  }
  // 按照配置的分隔符分割字符串，获取最小值和最大值
  const [datamin, datamax] = value.split(separator);
  if (fullrange && [datamin, datamax].filter((item) => item).length === 1) {
    callback(fullrangemessage);
    return;
  }
  if (asc && datamax && Number(datamin) > Number(datamax)) {
    callback("最小值需要小于最大值");
    return;
  }
  // 判断处理范围
  if (
    !isInRange(datamin, min, max) ||
    (datamax && !isInRange(datamax, min, max))
  ) {
    callback(`只允许[${min},${max}]范围内的正${integer ? "整" : ""}数`);
    return;
  }

  // 兜底代码。没有问题，通过校验
  callback();
}

// 辅助函数：判断值是否在指定范围内
function isInRange(value, min, max) {
  const numValue = Number(value);
  return numValue >= min && numValue <= max;
}

// --------------------------------------以下为【实例注入方法】------------------------------------------
// 【实例注入方法】获取是否属地化
// 这个方法会直接设置Vue实例的isOpenDependenceManage属性，使用该方法请留意data中是否有对应字段
export function getDependenceManage() {
  return getConfigByKey("dependence_manage").then((res) => {
    if (res.data) {
      this.isOpenDependenceManage = res.data.configValue === "0";
    }
  });
}
